package com.ai.config;

import com.ai.handler.RedisChatMemoryHandler;

import com.ai.tools.CourseToolService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor;
import org.springframework.ai.chat.memory.ChatMemory;
import org.springframework.ai.openai.OpenAiChatModel;
import org.springframework.ai.tool.ToolCallback;
import org.springframework.ai.tool.ToolCallbackProvider;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@Slf4j
public class AIConfiguration {

    @Bean
    public ChatMemory chatMemory() {
        return new RedisChatMemoryHandler();
    }

    /**
     * defaultSystem ： 默认系统角色
     * defaultTools ： 默认工具
     * defaultAdvisors ： 增强功能
     */
    @Bean
    public ChatClient openAiChatClient(OpenAiChatModel openAiChatModel,
                                       CourseToolService courseToolService,
                                       ToolCallbackProvider mcpTools    // mcp工具 最终配置的mcp工具都会到这个接口里
    ) {
        ToolCallback[] toolCallbacks = mcpTools.getToolCallbacks();
        for (ToolCallback toolCallback : toolCallbacks) {
            log.info("工具名称：" + toolCallback.getToolDefinition().name() + " 描述：" + toolCallback.getToolDefinition().description());
        }
        return ChatClient.builder(openAiChatModel).defaultSystem("""
                            ## 角色设定
                             你是E-Select选课系统的智能助手"小E"，你的职责是帮助学生完成课程选择、退选、查询等相关操作，同时提供校园生活相关的辅助服务。
                            \s
                             ## 行为准则
                             1. 始终以友好、专业、耐心的态度与用户交流
                             2. 使用清晰简洁的中文表达，避免使用过于专业的术语
                             3. 主动询问用户需求，提供个性化的选课建议和生活服务
                            \s
                             ## 操作规范
                             1. 对于查询类操作（如查看课程信息），可直接执行无需确认
                             2. 对于修改类操作（如发送邮件等），必须明确告知操作后果并等待用户回复"确认"后执行
                             3. 涉及重要操作时，需重复关键信息确保用户理解
                            \s
                             ## 特殊功能使用指导
                             1. 邮件通知功能：重要操作完成后可通过邮件发送确认信息，或根据用户需求发送课程提醒
                             2. 路线规划功能：可以为用户提供校园周边的出行路线规划服务
                            \s
                             ## 信息提供要求
                             1. 执行工具调用前，必须明确说明将要执行的操作和需要的参数
                             2. 工具调用后，需将结果以用户友好的方式解释说明
                             3. 遇到错误时，用通俗语言解释问题并提供解决建议
                             4. 对于返回的URL链接，必须保持原样返回，不得进行任何修改
                            \s
                             ## 服务边界
                             1. 对于无法处理的问题，引导用户联系人工客服
                             2. 保护用户隐私，不主动询问敏感信息
                        """)
                .defaultAdvisors(MessageChatMemoryAdvisor.builder(chatMemory()).build())
                .defaultTools(courseToolService)
                .defaultToolCallbacks(mcpTools) //  // MCP工具回调
                .build();
    }


}
